// jQuery.browser 兼容高版本 jquery
(function(jQuery){ 
	if(jQuery.browser) return; 

	jQuery.browser = {}; 
	jQuery.browser.mozilla = false; 
	jQuery.browser.webkit = false; 
	jQuery.browser.opera = false; 
	jQuery.browser.msie = false; 

	var nAgt = navigator.userAgent; 
	jQuery.browser.name = navigator.appName; 
	jQuery.browser.fullVersion = ''+parseFloat(navigator.appVersion); 
	jQuery.browser.majorVersion = parseInt(navigator.appVersion,10); 
	var nameOffset,verOffset,ix; 

	// In Opera, the true version is after "Opera" or after "Version" 
	if ((verOffset=nAgt.indexOf("Opera"))!=-1) { 
	jQuery.browser.opera = true; 
	jQuery.browser.name = "Opera"; 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+6); 
	if ((verOffset=nAgt.indexOf("Version"))!=-1) 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+8); 
	} 
	// In MSIE, the true version is after "MSIE" in userAgent 
	else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) { 
	jQuery.browser.msie = true; 
	jQuery.browser.name = "Microsoft Internet Explorer"; 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+5); 
	} 
	// In Chrome, the true version is after "Chrome" 
	else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) { 
	jQuery.browser.webkit = true; 
	jQuery.browser.name = "Chrome"; 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+7); 
	} 
	// In Safari, the true version is after "Safari" or after "Version" 
	else if ((verOffset=nAgt.indexOf("Safari"))!=-1) { 
	jQuery.browser.webkit = true; 
	jQuery.browser.name = "Safari"; 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+7); 
	if ((verOffset=nAgt.indexOf("Version"))!=-1) 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+8); 
	} 
	// In Firefox, the true version is after "Firefox" 
	else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) { 
	jQuery.browser.mozilla = true; 
	jQuery.browser.name = "Firefox"; 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+8); 
	} 
	// In most other browsers, "name/version" is at the end of userAgent 
	else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) < 
	(verOffset=nAgt.lastIndexOf('/')) ) 
	{ 
	jQuery.browser.name = nAgt.substring(nameOffset,verOffset); 
	jQuery.browser.fullVersion = nAgt.substring(verOffset+1); 
	if (jQuery.browser.name.toLowerCase()==jQuery.browser.name.toUpperCase()) { 
	jQuery.browser.name = navigator.appName; 
	} 
	} 
	// trim the fullVersion string at semicolon/space if present 
	if ((ix=jQuery.browser.fullVersion.indexOf(";"))!=-1) 
	jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix); 
	if ((ix=jQuery.browser.fullVersion.indexOf(" "))!=-1) 
	jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix); 

	jQuery.browser.majorVersion = parseInt(''+jQuery.browser.fullVersion,10); 
	if (isNaN(jQuery.browser.majorVersion)) { 
	jQuery.browser.fullVersion = ''+parseFloat(navigator.appVersion); 
	jQuery.browser.majorVersion = parseInt(navigator.appVersion,10); 
	} 
	jQuery.browser.version = jQuery.browser.majorVersion; 
})(jQuery); 

var WYAreaData = null;
var WYAreaConfig = {
    url : {
        get : '/area/?rd=' + Math.random(),
        version : '/area/?version=1&rd=' + Math.random()
    },
    prefix : 'wy_area_',
    pid : 0 ,     //0为爱员工商城
    version : 0,  //版本号
    time : 600    //检测频率，单位 秒
};
var WYArea = {
    init : function(fn) { //初始化
        if ( $.browser.msie ) {
            var v = parseFloat($.browser.version);
            if (v < 8) {
                $.getScript(WYAreaConfig.url.get, function(){
                    WYArea.call(fn);
                });
                return;
            }
        }
        WYAreaData = WYArea.data("data");
        WYAreaConfig.version = WYArea.data("version");
        if (!WYAreaData) WYArea.update(fn);
        else {
            var lastCheck = WYArea.data("lc");
            if (!lastCheck) {
                WYArea.data("lc", 1, WYAreaConfig.time);
                $.getScript(WYAreaConfig.url.version, function(){
                    if (WYAreaVersionUpdate !== WYAreaConfig.version) WYArea.update(fn);
                    else WYArea.call(fn);
                });
            } 
            else WYArea.call(fn);
        }
    },
    call : function(fn) {
        if (typeof fn === "function") fn();
    },
    update : function(fn) {
        $.getScript(WYAreaConfig.url.get, function(){
            if (!WYAreaData) alert('地区数据初始化出错，请刷新页面，重新加载');
            else {
                WYArea.data("data", WYAreaData);
                WYArea.data("version", WYAreaConfig.version);
                WYArea.call(fn);
            }
        });
    },
    data : function(k, v, t) {
        if (!v) return wyLocalData.LocalStorage.get(WYAreaConfig.prefix + k);
        wyLocalData.LocalStorage.set({key: WYAreaConfig.prefix + k, value:v, expires : t > 0 ? t * 1000 : null});
    },
    getAreaDataStr: function() {
        return WYAreaData;
    },
    getProv: function() { //获取省份
        return WYAreaData.match(/\d{6}1[^x00-xff]+[0-9]*[a-z]+/ig);
    },
    getCity: function(prov) { //获取市级
        prov = prov.toString().substr(0, 2);
        return this.getData(prov + '[0-9]{2}002[^x00-xff]+[0-9]*[a-z]+');
    },
    getArea: function(city) { //获取区县
        city = city.toString().substr(0, 4);
        return this.getData(city + '[0-9]{2}3[^x00-xff]+[0-9]*[a-z]+');
    },
    getItemById: function(id) { //获取地区ID获取单个结点
        var rs = this.getData('[0-9]{6}(1|2|3)[^x00-xff]+' + id + '[a-z]+', 'i');
        return rs ? rs[0] : null;
    },
    getItemByCode: function(areacode) { //根据地区编码获取单个结点
        var rs = this.getData(areacode + '(1|2|3)[^x00-xff]+[0-9]*[a-z]+', 'i');
        return rs ? rs[0] : null;
    },
    getItemByPY: function(py) {  //根据拼音获取单个结点
        var rs = this.getData('[0-9]{6}(1|2|3)[^x00-xff]+[0-9]*' + py, 'i');
        return rs ? rs[0] : null;
    },
    getByLetter: function(char, grade) {  //根据首字母搜索, 
        char = char.toLowerCase(), grade = grade ? grade : 2;
        return this.getData('[0-9]{6}' + grade + '[^x00-xff]+[0-9]*' + char + "[a-z]*");
    },
    getByName: function(name, grade) {  //根据首字母搜索, 
        grade = grade ? grade : 3;
        return this.getData('[0-9]{6}' + grade + '[^x00-xff]*?' + name + '[^x00-xff]*?[0-9]*[a-z]+');
    },
    getItem : function(val) { //获取单个结点，val可以为地区编码，可以为地区ID，可以为拼音
        if (/[a-zitem = this.getItemByPY(id);]+/.test(val)) {
            return this.getItemByPY(val);
        } else {
            var item = null;
            val = parseInt(val);
            if (val >= 100000) item = this.getItemByCode(val);
            if (!item) item = this.getItemById(val);
            return item;
        }
    },
    getPath: function(val) {  //获取结点树
        var rs = [], item = this.getItem(val);
        if (!item) return [];
        rs.push(item);
        item = this.parser(item);
        if (item.grade === "3") {
            var city = this.getData(item.code.substr(0, 4) + '002[^x00-xff]+[0-9]*[a-z]+', 'i');
            if (city) rs.push(city[0]);
        }
        if (item.grade !== "1") rs.push(this.getData(item.code.substr(0, 2) + '\\d{2}0\\d1[^x00-xff]+[0-9]*[a-z]+', 'i')[0]);
        return rs;
    },
    getData: function(regex, ig) { //获取数据的公共方法
        return WYAreaData.match(new RegExp(regex, ig ? ig : 'ig'));
    },
    parser: function(item) {
        if (!item) return null;
        var py = item.replace(/[^x00-xff]+[0-9]*/ig, '').substr(7);
        var aid = item.replace(/[^x00-xff]+|[a-z]+/ig, '').substr(7);
        return {
            aid:aid,
            code: item.substr(0, 6),
            grade: item.substr(6, 1),
            name: item.match(/[^x00-xff]+/ig)[0],
            py: py,
            letter: py.substr(0, 1).toUpperCase()
        };
    },
    select: function(opt, p, c, a, fn) {
        if (typeof opt !== "object") {
            opt = {def: parseInt(opt)};
            opt.def = opt.def ? opt.def : 0;
            if (fn) opt.change = fn;
            if (a) opt.level = 3, opt.prov = p, opt.city = c, opt.area = a;
            else if (c) opt.level = 2, opt.prov = p, opt.city = c, opt.area = '';
            else if (p) opt.level = 1, opt.prov = p, opt.city = '', opt.area = '';
        }
        var self = this;
        var def = {
            col:'code', //值字段，默认为地区编码(code)，可选值（code,aid,py）
            level: 3, //联动级别 可以是 1,2,3
            firstLang : ['选择省', '选择市', '选择区'],
            first: '<option value="">%lang%</option>',
            prov: '#selectProv',
            city: '#selectCity',
            area: '#selectArea',
            def: 0, //初始化节点，支持地区编码/id/拼音， 设置了初始化节点，data的预设值会失效
            data: [0, 0, 0], //初始化的省市区编码
            init : function () { console.log('inited'); }, //初始化结束事件
            change : function (val) { console.log(val) } //change事件
        };
        var config = jQuery.extend(def, opt);
        var isFirst = config.def;
        if (config.def) {
            var root = self.getPath(config.def);
            if (root) {
                config.data = [0, 0, 0];
                for (var i = 0; i < root.length; i++) {
                    var grade = parseInt(root[i].substring(6, 7));
                    config.data[grade - 1] = root[i].substring(0, 6);
                }
            }
        }
        if (config.first) {
            if ($(config.prov)) {
                $(config.prov).html(config.first.replace('%lang%', config.firstLang[0]));
            }
            if ($(config.city)) {
                $(config.city).html(config.first.replace('%lang%', config.firstLang[1]));
            }
            if ($(config.area)) {
                $(config.area).html(config.first.replace('%lang%', config.firstLang[2]));
            }
        }
        function initData(obj, data, val, trigger) {
            for (var i = 0;i < data.length; i++) {
                var one = self.parser(data[i]);
                var select = '';
                var itemVal = one[config.col];
                if (val == one.code) select = 'selected';
                $(obj).append('<option value="' + itemVal + '" ' + select + '>' + one.name + '</option>');
            }
            if (trigger) $(obj).trigger('change');
        }
        function initProv() {
            var prov = self.getProv();
            $(config.prov).empty();
            if ($(config.prov)) $(config.prov).html(config.first ? config.first.replace('%lang%', config.firstLang[0]) : '');
            if ($(config.city)) $(config.city).html(config.first ? config.first.replace('%lang%', config.firstLang[1]) : '');
            if ($(config.area)) $(config.area).html(config.first ? config.first.replace('%lang%', config.firstLang[2]) : '');
            if (!config.first && !config.data[0]) { 
                initData(config.prov, prov, prov[0].substring(0, 6)); 
            } else initData(config.prov, prov, config.data[0]);
        }
        function initCity(prov) {
            $(config.city).empty();
            if ($(config.city))
                $(config.city).html(config.first ? config.first.replace('%lang%', config.firstLang[1]) : '');
            if ($(config.area))
                $(config.area).html(config.first ? config.first.replace('%lang%', config.firstLang[2]) : '');
            if (!prov) return;
            var city = self.getCity(prov);
            if (!config.first && !config.data[1]) {
                initData(config.city, city, city[0].substring(0, 6));
                $(config.city).trigger('change');
            }
            else initData(config.city, city, config.data[1], !isFirst);
            isFirst = false;
        }
        function initArea(city) {
            $(config.area).empty();
            if (config.first) {
                $(config.area).html(config.first ? config.first.replace('%lang%', config.firstLang[2]) : '');
            }
            if (!city) return;
            var area = self.getArea(city);
            if (!area) area = [self.getItemByCode(city)];
            if (!config.first && !config.data[2]) {
                initData(config.area, area, area[0].substring(0, 6)); 
                $(config.area).trigger('change');
            }
            else initData(config.area, area, config.data[2]);
            config.data[2] = 0;
        }
        $(config.prov).unbind('change').bind("change", function() {
            var prov = $(this).val(), item = '';
            if (prov) item = WYArea.getItem(prov).substring(0, 6);
            if (config.level > 1) initCity(item);
            else config.change && config.change(prov);
        });
        $(config.city).unbind('change').bind("change", function() {
            var city = $(this).val(), item = '';
            if (city) item = WYArea.getItem(city).substring(0, 6);
            if (config.level > 2) initArea(item);
            else config.change && config.change(city);
        });
        $(config.area).unbind('change').bind("change", function() {
            var area = $(this).val();
            config.change && config.change(area);
        });
        initProv(0);
        if (config.level > 1 && config.data[0]) {
            $(config.prov).trigger('change');
            config.data[0] = 0;
        }
        if (config.level > 2 && config.data[1]) {
            $(config.city).trigger('change');
            config.data[1] = 0;
        }
        config.init && config.init();
    }
};

function WYAreaStore (key, val, expires)
{
    if (key === "__allkeys__") return wyLocalData.LocalStorage.getAllKeys();
    if (val === undefined || val=== null) {
        return wyLocalData.LocalStorage.get({
            key : key
        });
    } else {
        if (typeof val === "object") {
            val = this.obj2str(val);
        }
        var obj = { key : key, value : val };
        if (expires > 0) {
            obj.expires = expires * 1000;
        }
        wyLocalData.LocalStorage.set([obj]);
    }
}
if (!window.registNS) {
    window.registNS = function(fullNS,isIgnorSelf){
        //命名空间合法性校验依据
        var reg = /^[_$a-z]+[_$a-z0-9]*/i;

        // 将命名空间切成N部分, 比如baidu.libs.Firefox等
        var nsArray = fullNS.split('.');
        var sEval = "";
        var sNS = "";
        var n = isIgnorSelf ? nsArray.length - 1 : nsArray.length;
        for (var i = 0; i < n; i++){
            //命名空间合法性校验
            if(!reg.test(nsArray[i])) {
                throw new Error("Invalid namespace:" + nsArray[i] + "");
                return ;
            }
            if (i != 0) sNS += ".";
            sNS += nsArray[i];
            // 依次创建构造命名空间对象（假如不存在的话）的语句
            sEval += "if(typeof(" + sNS + ")=='undefined') " + sNS + "=new Object();else " + sNS + ";";
        }
        //生成命名空间
        if (sEval != "") {
            return eval(sEval);
        }
        return {};
    };


    /**
     * 注册命名空间
     */
    window.registNS('wyLocalData');

    /**
     * @class wyLocalData.LocalStorage
     * 跨浏览器的本地存储实现。高级浏览器使用localstorage，ie使用UserData。虽然说是本地存储，也请不要存储过大数据，最好不要大于64K.
     * 因为ie下UserData每页最大存储是64k。
     * @singleton
     */
    (function(){
        /**
         * 验证字符串是否合法的键名
         * @param {Object} key 待验证的key
         * @return {Boolean} true：合法，false：不合法
         * @private
         */
        function _isValidKey(key) {
            return (new RegExp("^[^\\x00-\\x20\\x7f\\(\\)<>@,;:\\\\\\\"\\[\\]\\?=\\{\\}\\/\\u0080-\\uffff]+\x24")).test(key);
        }

        //所有的key
        var _clearAllKey = "_wanyou.ALL.KEY_";

        /**
         * 创建并获取这个input:hidden实例
         * @return {HTMLInputElement} input:hidden实例
         * @private
         */
        function _getInstance(){
            //把UserData绑定到input:hidden上
            var _input = null;
            //是的，不要惊讶，这里每次都会创建一个input:hidden并增加到DOM树种
            //目的是避免数据被重复写入，提早造成“磁盘空间写满”的Exception
            _input = document.createElement("input");
            _input.type = "hidden";
            _input.addBehavior("#default#userData");
            document.body.appendChild(_input); 
            return _input;
        }

        /**
         * 将数据通过UserData的方式保存到本地，文件名为：文件名为：config.key[1].xml
         * @param {String} key 待存储数据的key，和config参数中的key是一样的
         * @param {Object} config 待存储数据相关配置
         * @cofnig {String} key 待存储数据的key
         * @config {String} value 待存储数据的内容
         * @config {String|Object} [expires] 数据的过期时间，可以是数字，单位是毫秒；也可以是日期对象，表示过期时间
         * @private
         */
        function __setItem(key,config){
            try {
                var input = _getInstance();
                //创建一个Storage对象
                var storageInfo = config || {};
                //设置过期时间
                if(storageInfo.expires) {
                    var expires;
                    //如果设置项里的expires为数字，则表示数据的能存活的毫秒数
                    if ('number' == typeof storageInfo.expires) {
                        expires = new Date();
                        expires.setTime(expires.getTime() + storageInfo.expires);
                    }
                    input.expires = expires.toUTCString();
                }

                //存储数据
                input.setAttribute(storageInfo.key,storageInfo.value);
            } catch (e) {
            }
        }

        /**
         * 将数据通过UserData的方式保存到本地，文件名为：文件名为：config.key[1].xml
         * @param {String} key 待存储数据的key，和config参数中的key是一样的
         * @param {Object} config 待存储数据相关配置
         * @cofnig {String} key 待存储数据的key
         * @config {String} value 待存储数据的内容
         * @config {String|Object} [expires] 数据的过期时间，可以是数字，单位是毫秒；也可以是日期对象，表示过期时间
         * @private
         */
        function _setItem(key,config){
            //保存有效内容
            __setItem(key,config);

            //下面的代码用来记录当前保存的key，便于以后clearAll
            var result = _getItem({key : _clearAllKey});
            if(result) {
                result = {
                    key : _clearAllKey,
                    value : result 
                };
            } else {
                result = {
                    key : _clearAllKey,
                    value : ""
                };
            }

            if(!(new RegExp("(^|\\|)" + key + "(\\||$)",'g')).test(result.value)) {
                result.value += "|" + key;
                //保存键
                __setItem(_clearAllKey,result);     
            }
        }

        /**
         * 提取本地存储的数据
         * @param {String} config 待获取的存储数据相关配置
         * @cofnig {String} key 待获取的数据的key
         * @return {String} 本地存储的数据，获取不到时返回null
         * @example 
         * wyLocalData.LocalStorage.get({
         *      key : "username"
         * });
         * @private
         */
        function _getItem(config){
            try {
                var input = _getInstance();
                //载入本地文件，文件名为：config.key[1].xml
                input.load(config.key);
                //取得数据
                return input.getAttribute(config.key) || null;
            } catch (e) {
                return null;            
            }
        }

        /**
         * 移除某项存储数据
         * @param {Object} config 配置参数
         * @cofnig {String} key 待存储数据的key
         * @private
         */
        function _removeItem(config){
                    try {
                            var input = _getInstance();
                            //载入存储区块
                            input.load(config.key);
                            //移除配置项
                            input.removeAttribute(config.key);
                            //强制使其过期
                            var expires = new Date();
                            expires.setTime(expires.getTime() - 1);
                            input.expires = expires.toUTCString();
                            input.save(config.key);

                            //从allkey中删除当前key			
                            //下面的代码用来记录当前保存的key，便于以后clearAll
                            var result = _getItem({key : _clearAllKey});
                            if(result) {
                                    result = result.replace(new RegExp("(^|\\|)" + config.key + "(\\||$)",'g'),'');
                                    result = {
                                            key : _clearAllKey,
                                            value : result 
                                    };
                                    //保存键
                                    __setItem(_clearAllKey,result);	
                            }

                    } catch (e) {
                    }
            }

        //移除所有的本地数据
        function _clearAll(){
            result = _getItem({key : _clearAllKey});
            if(result) {
                var allKeys = result.split("|");
                var count = allKeys.length;
                for(var i = 0;i < count;i++){
                    if(!!allKeys[i]) {
                        _removeItem({key:allKeys[i]});
                    }
                }
            }
        }


        /**
         * 获取所有的本地存储数据对应的key
         * @return {Array} 所有的key
         * @private 
         */
        function _getAllKeys(){
            var result = [];
            var keys = _getItem({key : _clearAllKey});
            if(keys) {
                keys = keys.split('|');
                for(var i = 0,len = keys.length;i < len;i++){
                    if(!!keys[i]) {
                        result.push(keys[i]);
                    }
                }
            }
            return result ;
        }

        /**
         * 判断当前浏览器是否支持本地存储：window.localStorage
         * @return {Boolean} true：支持；false：不支持
         * @remark 支持本地存储的浏览器：IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
         * @private
         */
        var _isSupportLocalStorage = (('localStorage' in window) && (window['localStorage'] !== null)),
            _isSupportUserData = !!jQuery.browser.ie;

        wyLocalData.LocalStorage = {
            /**
             * 如果支持本地存储，返回true；否则返回false
             * @type Boolean
             */
            isAvailable : _isSupportLocalStorage || _isSupportUserData,

            /**
             * 将数据进行本地存储（只能存储字符串信息）
             * <pre><code>
                     * //保存单个对象
                     * wyLocalData.LocalStorage.set({
                     * 		key : "username",
                     * 		value : "baiduie",
                     * 		expires : 3600 * 1000
                     * });
                     * //保存对个对象
                     * wyLocalData.LocalStorage.set([{
                     * 		key : "username",
                     * 		value : "baiduie",
                     * 		expires : 3600 * 1000
                     * },{
                     * 		key : "password",
                     * 		value : "zxlie",
                     * 		expires : 3600 * 1000
                     * }]);
             * </code></pre>
             * @param {Object} obj 待存储数据相关配置，可以是单个JSON对象，也可以是由多个JSON对象组成的数组
             * <ul>
             * <li><b>key</b> : String <div class="sub-desc">待存储数据的key，务必将key值起的复杂一些，如：baidu.username</div></li>
             * <li><b>value</b> : String <div class="sub-desc">待存储数据的内容</div></li>
             * <li><b>expires</b> : String/Object (Optional)<div class="sub-desc">数据的过期时间，可以是数字，单位是毫秒；也可以是日期对象，表示过期时间</div></li>
             * </ul>
             */
            set : function(obj){
                            //保存单个对象
                            var _set_ = function(config){
                                    //key校验
                                    if(!_isValidKey(config.key)) {return;}

                                    //待存储的数据
                                    var storageInfo = config || {};

                                    //支持本地存储的浏览器：IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
                                    if(_isSupportLocalStorage) {
                                            window.localStorage.setItem(storageInfo.key,storageInfo.value);
                                            if(config.expires) {
                            var expires;
                            //如果设置项里的expires为数字，则表示数据的能存活的毫秒数
                            if ('number' == typeof storageInfo.expires) {
                                expires = new Date();
                                expires.setTime(expires.getTime() + storageInfo.expires);
                            }

                            window.localStorage.setItem(storageInfo.key + ".expires",expires);
                                            }
                                    } else if(_isSupportUserData) { //IE7及以下版本，采用UserData方式
                                            _setItem(config.key,storageInfo);
                                    }	
                            };

                            //判断传入的参数是否为数组
                            if(obj && obj.constructor === Array && obj instanceof Array){
                                    for(var i = 0,len = obj.length;i < len;i++){
                                            _set_(obj[i]);
                                    }
                            }else if(obj){
                                    _set_(obj);
                            }
            },

                    /**
                     * 提取本地存储的数据
             * <pre><code>
                     * //获取某一个本地存储，返回值为：{key:"",value:"",expires:""}，未取到值时返回值为：null
                     * var rst = wyLocalData.LocalStorage.get({
                     * 		key : "username"
                     * });
                     * //获取多个本地存储，返回值为：["","",""]，未取到值时返回值为：[null,null,null]
                     * wyLocalData.LocalStorage.get([{
                     * 		key : "username"
                     * },{
                     * 		key : "password"
                     * },{
                     * 		key : "sex"
                     * }]);
             * </code></pre>
                     * @param {String} obj 待获取的存储数据相关配置，支持单个对象传入，同样也支持多个对象封装的数组格式
                     * @config {String} key 待存储数据的key
                     * @return {String} 本地存储的数据，传入为单个对象时，返回单个对象，获取不到时返回null；传入为数组时，返回为数组
                     */
            get : function(obj){
                            //获取某一个本地存储
                            var _get_ = function(config){
                                    //结果	
                                    var result = null;
                                    if(typeof config === "string") config = {key : config};
                                    //key校验
                                    if(!_isValidKey(config.key)) {return result;}

                                    //支持本地存储的浏览器：IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
                                    if(_isSupportLocalStorage) {
                                            result = window.localStorage.getItem(config.key);
                                            //过期时间判断，如果过期了，则移除该项
                                            if(result) {
                                                    var expires = window.localStorage.getItem(config.key + ".expires");
                                                    result = {
                                                            value : result,
                                                            expires : expires ? new Date(expires) : null
                                                    };
                                                    if(result && result.expires && result.expires < new Date()) {
                                                            result = null;
                                                            window.localStorage.removeItem(config.key);
                                window.localStorage.removeItem(config.key + ".expires");
                                                    }
                                            }
                                    } else if(_isSupportUserData) { //IE7及以下版本，采用UserData方式
                                            //这里不用单独判断其expires，因为UserData本身具有这个判断
                                            result = _getItem(config);
                                            if(result) {
                                                    result = { value : result };
                                            }
                                    }

                                    return result ? result.value : null;
                            };

                            var rst = null;
                            //判断传入的参数是否为数组
                            if(obj && obj.constructor === Array && obj instanceof Array){
                                    rst = [];
                                    for(var i = 0,len = obj.length;i < len;i++){
                                            rst.push(_get_(obj[i]));
                                    }
                            }else if(obj){
                                    rst = _get_(obj);
                            }
                            return rst;
            },

            /**
             * 移除某一项本地存储的数据
             * <pre><code>
                     * //删除一个本地存储项
                     * wyLocalData.LocalStorage.remove({
                     * 		key : "username"
                     * });
                     * //删除多个本地存储项目 *
                     * wyLocalData.LocalStorage.remove([{
                     * 		key : "username"
                     * },{
                     * 		key : "password"
                     * },{
                     * 		key : "sex"
                     * }]);
             * </code></pre>
                     * @param {String} obj 待移除的存储数据相关配置，支持移除某一个本地存储，也支持数组形式的批量移除
                     * @config {String} key 待移除数据的key
                     * @return 无
             */
            remove : function(obj){
                            //移除某一项本地存储的数据
                            var _remove_ = function(config){
                                    //支持本地存储的浏览器：IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
                                    if(_isSupportLocalStorage) {
                                            window.localStorage.removeItem(config.key);
                                            window.localStorage.removeItem(config.key + ".expires");
                                    } else if(_isSupportUserData){ //IE7及以下版本，采用UserData方式
                                            _removeItem(config);
                                    }
                            };

                            //判断传入的参数是否为数组
                            if(obj && obj.constructor === Array && obj instanceof Array){
                                    for(var i = 0,len = obj.length;i < len;i++){
                                            _remove_(obj[i]);
                                    }
                            }else if(obj){
                                    _remove_(obj);
                            }
            },

            /**
             * 清除所有本地存储的数据
             * <pre><code>
             * wyLocalData.LocalStorage.clearAll();
             * </code></pre>
             */
            clearAll : function(){
                //支持本地存储的浏览器：IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
                if(_isSupportLocalStorage) {
                    window.localStorage.clear();
                } else if(_isSupportUserData) { //IE7及以下版本，采用UserData方式
                    _clearAll();
                }
            },
            /**
             * 获取所有的本地存储数据对应的key
             * <pre><code>
             * var keys = wyLocalData.LocalStorage.getAllKeys();
             * </code></pre>
             * @return {Array} 所有的key
             */
            getAllKeys : function(){
                var result = [];
                //支持本地存储的浏览器：IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
                if(_isSupportLocalStorage) {
                    var key;
                    for(var i = 0,len = window.localStorage.length;i < len;i++){
                        key = window.localStorage.key(i);
                        if(!/.+\.expires$/.test(key)) {
                            result.push(key);
                        }
                    }
                } else if(_isSupportUserData) { //IE7及以下版本，采用UserData方式
                    result = _getAllKeys();
                }
                return result;
            }
        };
    })();
}